package tests;
import modelo.*;
import junit.framework.TestCase;
import utilitarios.DireccionDerecha;
import utilitarios.PuntoXY;

public class PruebasArma extends TestCase {

	protected Escenario escenario;

	@Override
    public void setUp() {
		escenario = new Escenario(300, 300);
	}

	public void testDescargarBalasReduceEnUnoLaCantidadDelArsenal() {

		// ARRANGE
		Ametralladora amet = new Ametralladora(escenario, new PuntoXY(0, 0));
		int cantidadInicial = amet.cantidadBalas();

		// ACT
		for (int i = 0; i < 50; i++) {
			amet.descargar();
		}

		//ASSERT
		assertEquals(cantidadInicial - 50, amet.cantidadBalas());
	}

	public void testDescargarBalaDevuelveUnaBala() {

		// ARRANGE
		Ametralladora amet = new Ametralladora(escenario, new PuntoXY(0, 0));

		// ACT
		Proyectil bala = amet.descargar();

		// ASSERT
		assertNotSame(null, bala);

	}

	public void testSiHayUnArmaEnElPisoYElAlgoTankLaTomaSuArmaMejora() {

		// ARRANGE
		Escenario escenario = new Escenario(300, 300);
		TanqueAlgo algotank = new TanqueAlgo(escenario, new PuntoXY(15, 15));
		Arma canion = new Canion(escenario, new PuntoXY(45, 15));

		escenario.agregarObjeto(algotank);
		escenario.agregarObjeto(canion);

		Arma armaInicial = algotank.getArma();

		// ACT
		algotank.seMovera(new DireccionDerecha());
		for (int i = 1; i < 4; i++) {
			escenario.vivir();
		}

		// ASSERT
		assertEquals(canion, algotank.getArma());
		assertEquals(false, escenario.contieneA(armaInicial));
		assertEquals(false, escenario.contieneA(canion));

	}

	public void testSiHayUnArmaEnElPisoYUnTanqueEnemigoCaminaSobreEllaSuArmaNoCambia() {

		// ARRANGE
		Escenario escenario = new Escenario(300, 300);
		TanqueAlgo jugador = new TanqueAlgo(escenario, new PuntoXY(15, 15));
		TanqueGrizzly tanqueEnemigo = new TanqueGrizzly(escenario, new PuntoXY(100, 100), jugador);
		Arma canion = new Canion(escenario, new PuntoXY(130, 100));

		escenario.agregarObjeto(jugador);
		escenario.agregarObjeto(tanqueEnemigo);
		escenario.agregarObjeto(canion);

		Arma armaInicial = tanqueEnemigo.getArma();

		// ACT
		tanqueEnemigo.seMovera(new DireccionDerecha());
		for (int i = 1; i < 5; i++) {
			escenario.vivir();
		}

		// ASSERT
		assertEquals(armaInicial, tanqueEnemigo.getArma());
		assertEquals(false, escenario.contieneA(armaInicial));
		assertEquals(true, escenario.contieneA(canion));

	}

}
